% 判断矩阵A表示A1...An对于总目标的判断矩阵。
% AB(i)表示B1...Bm在上层(A)的指标i下的判断矩阵。
% 此例子中A1..A5, B1...B3

% input
A = [1 1/2 4 3 3;
      2 1 7 5 5;
      1/4 1/7 1 1/2 1/3;
      1/3 1/5 2 1 1;
      1/3 1/5 3 1 1];
AB(:, :, 1) = [1 2 5;  1/2 1 2;  1/5 1/2 1;];
AB(:, :, 2) = [1 1/3 1/8;  3 1 1/3;  8 3 1];
AB(:, :, 3) = [1 1 3;  1 1 3;  1/3 1/3 1];
AB(:, :, 4) = [1 3 4;  1/3 1 1;  1/4 1 1];
AB(:, :, 5) = [1 1 1/4;  1 1 1/4;  4 4 1];

[w_A, CI_A, RI_A] = SingleLevelAHP(A);
w_B = DoubleLevelAHP(w_A, AB);

% @params w_A: A层权重 size = n*1
% @params AB : B层相对于A层的判断矩阵 size = m*m*n
% @return w_B: B层相对总目标的权重排序 size = m*1
function w_B = DoubleLevelAHP(w_A, AB)
[nA, ~] = size(w_A);
disp('nA=');
disp(nA);
w_AB = [];
CI_AB = [];
RI_AB = [];
for j = 1:nA
    %对AB中的每一个矩阵做单层的排序和检验
    [w_AB(:, j), CI_AB(j), RI_AB(j)] = SingleLevelAHP(AB(:,:,j));
end
w_B = w_AB * w_A;
CR_AB = (CI_AB * w_A) / (RI_AB * w_A);
if CR_AB < 0.1
    disp('层次总排序一致性检验通过');
else
    disp('层次总排序一致性检验未通过, 请重新评分');
end
end

% @params A : 单层的判断矩阵 size = n*n
% @return w : 单层的权重排序 size = n*1
% @return CI: 单层的CI 标量
% @return RI: 单层的RI 标量
function [w, CI, RI] = SingleLevelAHP(A)
 [~, n] = size(A);
 [V, D] = eig(A);  % D为特征值，放在对角元素上。
 [LAMBDA, pos] = max(max(D)); % LAMBDA为最大特征值, pos为第几列。
 w = V(:, pos); % 取出单层次排序 权重列向量。
 w = w / sum(w); % 归一化
 disp('w = ');
 disp(w);
 disp('lambda = ');
 disp(LAMBDA);
 
 % 一致性检验
 CI = (LAMBDA-n)/(n-1);
 RIs = [0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46];
 RI = RIs(n);
 CR = CI / RI;
 if CR < 0.1
     disp('层次单排序一致性检验通过');
 else
     disp('层次单排序一致性检验未通过, 请重新评分');
 end
 end
